package com.doubao.user.service;

import com.doubao.common.result.Result;
import com.doubao.user.entity.UserDailyToken;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 用户每日token使用记录服务接口
 */
public interface UserDailyTokenService {

    /**
     * 获取用户某日token使用记录
     *
     * @param userId 用户ID
     * @param date   日期
     * @return token使用记录
     */
    UserDailyToken getUserDailyToken(Long userId, LocalDate date);

    /**
     * 创建用户每日token记录
     *
     * @param userId     用户ID
     * @param date       日期
     * @param limitTokens token限制
     * @return 创建结果
     */
    Result<Void> createDailyToken(Long userId, LocalDate date, Integer limitTokens);

    /**
     * 增加用户当日输入tokens
     *
     * @param userId 用户ID
     * @param date   日期
     * @param tokens token数量
     * @return 操作结果
     */
    Result<Void> increasePromptTokens(Long userId, LocalDate date, Integer tokens);

    /**
     * 增加用户当日输出tokens
     *
     * @param userId 用户ID
     * @param date   日期
     * @param tokens token数量
     * @return 操作结果
     */
    Result<Void> increaseCompletionTokens(Long userId, LocalDate date, Integer tokens);

    /**
     * 更新用户当日token限制
     *
     * @param userId 用户ID
     * @param date   日期
     * @param limit  token限制
     * @return 操作结果
     */
    Result<Void> updateTokenLimit(Long userId, LocalDate date, Integer limit);

    /**
     * 获取用户某日已使用的token总量
     *
     * @param userId 用户ID
     * @param date   日期
     * @return 已使用token总量
     */
    int getUsedTokens(Long userId, LocalDate date);

    /**
     * 获取用户某月每日token使用记录
     *
     * @param userId 用户ID
     * @param year   年
     * @param month  月
     * @return 每日token使用记录列表
     */
    List<UserDailyToken> getMonthlyTokens(Long userId, int year, int month);

    /**
     * 获取用户某月token使用趋势
     *
     * @param userId 用户ID
     * @param year   年
     * @param month  月
     * @return token使用趋势数据
     */
    List<Map<String, Object>> getMonthlyTrend(Long userId, int year, int month);

    /**
     * 检查用户今日token是否超限
     *
     * @param userId 用户ID
     * @return 是否超限
     */
    boolean isTokenLimitExceeded(Long userId);

    /**
     * 获取用户今日可用token数量
     *
     * @param userId 用户ID
     * @return 可用token数量
     */
    int getAvailableTokens(Long userId);
}